package com.wolfeyes.common.utils.network.http;

import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.wolfeyes.common.utils.character.Convert;
import com.wolfeyes.common.utils.character.StringUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @see Talk is cheap, Show me the code. -- Linus Torvalds
 * @title 从当前绑定的线程上获取请求属性
 * @author yanyljava
 * @create 2022-01-07 21:25
 */
public class ServletUtils {


	/**
	 * @title 获取所有请求属性
	 * @return 请求属性
	 */
	public static ServletRequestAttributes getRequestAttributes() {
		
		RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
		return (ServletRequestAttributes) requestAttributes;
	}
	
	/**
	 * @title 获取request请求对象
	 * @return
	 */
	public static HttpServletRequest getRequest() {
		
		return getRequestAttributes().getRequest();
	}

	/**
	 * @title 获取response响应对象
	 * @return
	 */
	public static HttpServletResponse getResponse() {
		
		return getRequestAttributes().getResponse();
	}

	/**
	 * @title 获取session域对象
	 * @return
	 */
	public static HttpSession getSession() {
		
		return getRequest().getSession();
	}
	
	/**
	 * @title 获取String参数
	 */
	public static String getParameter(String name) {
		
		return getRequest().getParameter(name);
	}

	/**
	 * @title 获取String参数
	 */
	public static String getParameter(String name, String defaultValue) {
		
		return Convert.toStr(getRequest().getParameter(name), defaultValue);
	}

	/**
	 * @title 获取Integer参数
	 */
	public static Integer getParameterToInt(String name) {
		
		return Convert.toInt(getRequest().getParameter(name));
	}

	/**
	 * @title 获取Integer参数
	 */
	public static Integer getParameterToInt(String name, Integer defaultValue) {
		
		return Convert.toInt(getRequest().getParameter(name), defaultValue);
	}

	/**
	 * @title 将字符串渲染到客户端
	 *
	 * @param response 渲染对象
	 * @param string 待渲染的字符串
	 * @return null
	 */
	public static String renderString(HttpServletResponse response, String string) {
		
		try
		{
			response.setStatus(200);
			response.setContentType("application/json");
			response.setCharacterEncoding("utf-8");
			response.getWriter().print(string);
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * @title 是否是Ajax异步请求
	 *
	 * @param request
	 */
	public static boolean isAjaxRequest(HttpServletRequest request) {
		
		String accept = request.getHeader("accept");
		if (accept != null && accept.indexOf("application/json") != -1)
		{
			return true;
		}

		String xRequestedWith = request.getHeader("X-Requested-With");
		if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1)
		{
			return true;
		}

		String uri = request.getRequestURI();
		if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml"))
		{
			return true;
		}

		String ajax = request.getParameter("__ajax");
		if (StringUtils.inStringIgnoreCase(ajax, "json", "xml"))
		{
			return true;
		}
		return false;
	}

}

